package org.csy.generic.test00.demo06.teacherWork;

import java.util.Arrays;

/**
 * @author CSY
 * @date 2025 - 03 - 27
 */
public class MyArrayList<E> {
    /**
     * 数组默认容量
     */
    private static final int DEFAULT_CAPACITY = 10;

    /**
     * 封装的数组
     */
    private Object[] elementData = {};

    /**
     * 实际使用容量
     */
    private int size;

    /**
     * 缺省构造方法
     */
    public MyArrayList() {
        this.elementData = new Object[DEFAULT_CAPACITY];
    }

    public MyArrayList(int size) {
        this.elementData = new Object[size];
    }

    /**
     * 添加数据
     * @param e
     * @return
     */
    public boolean add(E e) {
        //判断是否需要扩容
        grow();

        this.elementData[size++] = e;

        return true;
    }

    /**
     * 实现数组扩容
     */
    private void grow() {
        if(size == this.elementData.length){
            Object[] newArr = Arrays.copyOf(this.elementData,this.elementData.length * 2);
            this.elementData = newArr;
        }
    }

    /**
     * 删除指定下标的元素
     * @param index 下标
     * @return 删除的元素
     */
    public E remove(int index) {
        checkIndex(index);
        E oldElement = (E)this.elementData[index];
        System.arraycopy(this.elementData,index+1,this.elementData,index,this.size-index-1);
        //清空末尾数据
        this.elementData[size-1] = null;
        size--;
        return oldElement;
    }

    /**
     * 设置指定下标元素的值
     * @param index 下标
     * @param element 值
     * @return 设置之前的值
     */
    public E set(int index, E element) {
        checkIndex(index);

        E oldElement = (E)this.elementData[index];

        this.elementData[index] = element;

        return oldElement;
    }

    /**
     * 获取指定下标的值
     * @param index 下标
     * @return 值
     */
    public E get(int index) {
        checkIndex(index);

        return (E)this.elementData[index];
    }

    /**
     * 合法性验证，判断下标是否越界
     * @param index 下标
     */
    private void checkIndex(int index) {
        //合法性验证 - 健壮性
        if (index < 0 || index > this.size){
            throw new IndexOutOfBoundsException("下标索引越界,当前下标为："+ index);
        }
    }

    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder("[");
        for (int i = 0; i < size; i++) {
            sb.append(this.elementData[i]).append(",");
        }
        if (sb.length() == 1){
            sb.append("]");
        }else{
            sb.setCharAt(sb.length()-1,']');
        }
        /*sb.deleteCharAt(sb.length() - 1);
        sb.append("]");*/
        return sb.toString();
    }

    /**
     * 获取数组的实际长度
     * @return 实际长度
     */
    public int size(){
        return size;
    }

    /**
     * 判断数组是否为空
     * @return 布尔值
     */
    public boolean isEmpty(){
        return size == 0;
    }
}
